#include"Log.hpp"
#include"Task.hpp"
#include"ThreadPool.hpp"
#include<memory>

using namespace LogModule;
using namespace ThreadPoolModule;

// .hpp header only

int main()
{
    //C++ 14，构建对象，返回智能指针的做法      <>中  传策略
    // std::unique_ptr<LogStrategy> strategy = std::make_unique<ConsoleLogStrategy>();    //打印到显示器上的策略 
    // strategy->SyncLog("hello cosolelog!!!");     //这个就是往显示器上打
    
    // std::unique_ptr<LogStrategy> strategy = std::make_unique<FileLogStrategy>();    //打印到文件中的策略
    // strategy->SyncLog("hello filelog!!!");     //这个就是往文件中打
    

//测试打印信息
    // logger.EnableFileLogStrategy();       //向文件中打
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world" << 3.14 << " " << 8899 << "aaaa";
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world";
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world";
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world";
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world";
    // logger(LogLevel::DEBUG,"main.cc",10) << "hello world";

//测试宏的打印
    // Enable_Console_Log_Strategy();
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;

//日志  基于策略可以随时变换
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;
    // LOG(LogLevel::DEBUG) << "hello world" <<3.14;



//对于线程池
    Enable_Console_Log_Strategy();   //开启日志
    


//在不用单例模式的情况下可以使用下面的代码
    // ThreadPool<task_t> *tp = new ThreadPool<task_t>();
    // // tp->Equeue(t);
    // tp->Start();
    
    //组上十个任务
    int count = 10;
    while(count)
    {
        // tp->Enqueue(Download);
        //会向线程池内入任务，线程池内部会Enqueue，就会唤醒一个线程，醒来的任务就会处理对应任务，入队就会自动进行处理
        
    //有了单例
        sleep(1);     
        ThreadPool<task_t>::GetInstance()->Enqueue(Download);
        count--;
    }
    ThreadPool<task_t>::GetInstance()->Stop();
    ThreadPool<task_t>::GetInstance()->Join();    //有了单例之后，不需要创建对象，直接使用
 
    // tp->Stop();
    // tp->Join();      //线程等待
    // sleep(1);

    return 0;
}


 